iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 19
0
自我挑戰組

Kotlin Everyday:新手寫程式踩的坑系列 第 19

Day 19 ─用 Kotlin 做待辦清單 Todolist(3) SharedPreferences 下篇

  • 分享至 

  • xImage
  •  

昨天設迴圈來跑未知的 key 值、確認資料有被存進去,接下來要修改讀取資料的程式碼,原本我們的寫法是只會讀取到一個 key 值為 todo 的資料,先把 code 註解掉

fun getData(){
    val sharedPreferences = getSharedPreferences("save", Activity.MODE_PRIVATE)
    // val todo = Thing(sharedPreferences.getString("todo", "")!!)
    // things.add(todo)
    adapter.notifyDataSetChanged()
}

SharedPreferences.getAll()
要取得 SharedPreferences 檔案中所有資料,使用 getAll () 這個方法可以取得所有的資料,它會回傳格式為 Map 的資料,Map 集合是按照 key-value 的方式存放

  • 宣告一個 todolist 來放置取出的全部資料
val todolist : MutableMap<String, ?> = sharedPreferences.getAll()

然而我們只需要 key 值,所以就只取 key 值(.keys),這時候看到回傳 MutableSet<String!> ,也就是我們要取的東西,但要注意 set 集合有一個特性是它沒有特定順序,取出來的東西會怎麼排序無法確定,可能亂序也有可能照順序,這時候可以運用集合的一個功能--- sorted 按照自然排序來返回元素

  • 現在 todolist : List<String!> 裡面是全部的 key 值,並且有照順序)

我們要做的,是把 key 值對應的 value 全部讀出來,並且塞進 things 陣列,同樣利用 for 迴圈來跑,最後才做 adapter 畫面更新:

fun getData(){
    val sharedPreferences = getSharedPreferences("save", Activity.MODE_PRIVATE)
    val todolist = sharedPreferences.all.keys.sorted()
    for(todo in todolist){   //todo 是在 todolist 的 key
        things.add(Thing(sharedPreferences.getString(todo, "")!!))
    }
    adapter.notifyDataSetChanged()
}

程式碼終於大功告成,現在來 biu 一次看看結果,哇~果然又是小毛病一堆XDD
輸入新的待辦事項後,返回主頁,會發現到前面的資料重複顯示了,但是跳出 APP 後又回復正常,這說明了 SharedPreferences 內存的資料沒有問題,有問題的地方是畫面更新的時候:

畫面更新是 Adapter 來做,Adapter 會把 things 裡面的資料和畫面綁定顯示出來,顯然,現在 things 的部分資料會每跑一次返回就多一個,因為 things 是陣列集合,我們要來了解集合的特性才知道該怎麼解決:

集合資料(List、Map、Set)

Kotlin 中的 List、Map、Set 資料只能讀取、不能任意修改,如果需要的話得使用 Mutablelist、Mutablemap 或 Mutableset 等函數,修改集合的方式:

  • add/ put 增加元素
  • remove 移除元素
  • clear 刪除元素

我們已經使用過集合的幾個功能,像是 add()、sorted() 等等,現在要做的就是 clear 刪除元素 這個功能:
每次返回頁面,執行 function getData 時,我們都會再加入 SharedPreferences 所有資料一次,而舊的資料還留在 things 陣列集合裡,才會導致前面資料會重複顯示、但重開程式的初始畫面又歸於正常,所以~只需要「在加入資料之前先清掉 things 陣列的原有內容,因為他們全部會被重新添加」這個動作,畫面就沒問題囉!

things.clear()   //重新添加之前,清掉things舊的資料

val todolist = sharedPreferences.all.keys.sorted()
for(todo in todolist){
    things.add(Thing(sharedPreferences.getString(todo, "")!!))
}

上一篇
Day 18 ─用 Kotlin 做待辦清單 Todolist(2) SharedPreferences 中篇
下一篇
Day 20 ─用 Kotlin 做待辦清單 Todolist(4) 給RecyclerView Item添加點擊事件
系列文
Kotlin Everyday:新手寫程式踩的坑30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言